package beans;

import pool.*;
import java.util.*;
import java.sql.*;

/**
 * @author Antonin Mozzati
 * @author Yannick Schürter
 */
public class ListeInvitations {

    private ArrayList<InvitationBean> listeInvitations;
    JDCConnectionDriver driver;
    Connection connexion;

    public ListeInvitations(JDCConnectionDriver driver) throws Exception {
	this.driver = driver;
    }

    // Retourne la liste des invitations actuellement dans la base
    public ArrayList<InvitationBean> getListeInvitations() {
	PreparedStatement ps;
	listeInvitations = new ArrayList<InvitationBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT id_invitation, id_utilisateur,"
                    + " id_flux, peutPoster FROM app.invitations");
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		InvitationBean invitation = new InvitationBean(
			new Integer(rs.getString(1)),
			new Integer(rs.getString(2)),
			new Integer(rs.getString(3)),
			new Integer(rs.getString(4)));
		listeInvitations.add(invitation);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeInvitations;
    }

    public void addInvitation(InvitationBean ib) {
        if (!this.estInvite(ib.getId_flux(), ib.getId_utilisateur())) {
            try {
                this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
                PreparedStatement ps;
                System.out.println("Ajout de l'invitation");

                ps = connexion.prepareStatement("Insert into app.invitations (id_utilisateur, peutPoster, id_flux) VALUES ("
                        + ib.getId_utilisateur() + ", "
                        + ib.getPeutPoster() + ", "
                        + ib.getId_flux() + ")");
                ps.executeUpdate();
                System.out.println("Invitation ajoutée avec succès.");

                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void removeInvitation(int id_invitation) {
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    PreparedStatement ps;
	    System.out.println("Suppresion de l'invitation ");
	    ps = connexion.prepareStatement("DELETE FROM app.invitations"
                    + " WHERE id_invitation="+id_invitation);
	    ps.executeUpdate();
	    System.out.println("Invitation retirée avec succès.");
	    ps.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public InvitationBean getById(int id_invitation) {
	for (InvitationBean ib : this.getListeInvitations()) {
	    if (ib.getId_invitation() == (id_invitation)) {
		return ib;
	    }
	}
	return null;
    }

    public ArrayList<InvitationBean> getByUser(int id_utilisateur) {
	ArrayList<InvitationBean> listeInvitations = new ArrayList<InvitationBean>();
	for (InvitationBean ib : this.getListeInvitations()) {
	    if (ib.getId_utilisateur() == (id_utilisateur)) {
		if (!listeInvitations.contains(ib)) {
		    listeInvitations.add(ib);
		}
	    }
	}
	return listeInvitations;
    }

    /**
     * @param id_utilisateur
     * @return le nombre d'invitations d'un utilisateur
     */
    public int getNbByUser(int id_utilisateur) {
	int res = 0;
	for (InvitationBean ib : this.getListeInvitations()) {
	    if (ib.getId_utilisateur() == id_utilisateur) {
		res++;
	    }
	}
	return res;
    }

    /**
     * @param id_flux
     * @param id_utilisateur
     * @return true si l'utilisateur est invité à suivre le flux
     */
    public boolean estInvite(int id_flux, int id_utilisateur) {
	for (InvitationBean ib : this.getByUser(id_utilisateur)) {
            if (ib.getId_flux() == id_flux) {
                return true;
            }
	}
        return false;
    }
    
}
